package com.yunwushanhe.handler.mybatisplus;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.yunwushanhe.util.UserContextUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @Author 抬头看看天
 * @Date 2023-08-12  21:21:16
 *
 * 这个类用于自动填充
 */
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        Long userId = null;
        try {
            userId = UserContextUtil.getUserId();
        } catch (Exception e) {
            System.out.println("未登录时不能使用这个接口，因为经过登录之后，SecurityContextHolder 中才被存入了id数据，否则会报错");
            throw e; //最好使用这段代码处理，让 try catch 语句后面的代码无法执行，finally里面的代码是可以执行的
//            e.printStackTrace();
//            userId = -1L;//表示是自己创建
        }
        // 这个异常的处理，不应该使用try catch语句，因为一旦出现异常，之后的代码依然会运行，但我们是需要之后的代码不能运行，故用throw处理
        // 这也是对异常处理是选择用 try catch 还是 throw 处理的一大标准
        // 这里的字段指的是Java代码的字段，不是数据库的
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("createBy",userId , metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
        this.setFieldValByName("updateBy", userId, metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
        this.setFieldValByName("updateBy", UserContextUtil.getUserId(), metaObject);
    }
}
